package com.nas.crocus.controller;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.nas.crocus.domain.Actividad;
import com.nas.crocus.domain.Alojamiento;
import com.nas.crocus.domain.Evento;
import com.nas.crocus.domain.Pasajero;
import com.nas.crocus.domain.Vuelo;
import com.nas.crocus.exception.NotFoundException;
import com.nas.crocus.service.EventoService;


@Controller
@RequestMapping(value = "/evento")
public class EventoController {
    
    @Autowired
    private EventoService eventoService;
    
    @RequestMapping(method = RequestMethod.GET)
    public @ResponseBody Collection<Evento> buscarTodos() {
        Collection<Evento> eventos = eventoService.buscar();
        ArrayList <Alojamiento> alojamientos = new ArrayList<Alojamiento>();
        ArrayList <Actividad> actividades = new ArrayList<Actividad>();
        ArrayList <Pasajero> pasajeros = new ArrayList<Pasajero>();

        for (Evento evento : eventos) {
            evento.setAlojamientos(alojamientos);
            evento.setActividades(actividades);
            evento.setRuta(null);
        }
        
        return eventos;
    }

    @RequestMapping(value = "/id/{id}", method = RequestMethod.GET)
    public @ResponseBody Evento obtenerEvento(@PathVariable Long id) throws NotFoundException {
        Evento evento = eventoService.buscar(id);
        if (evento == null) {
            throw new NotFoundException("Evento no encontrado");
        }
        return eventoService.buscar(id);
    }
    
    @RequestMapping(method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public @ResponseBody Evento crear(@RequestBody Evento evento) {
        eventoService.guardar(evento);
        
        eliminar_recursividad(evento);
        return evento;
    }

    @RequestMapping(method = RequestMethod.PUT)
    public @ResponseBody Evento actualizar(@RequestBody Evento evento) {
        eventoService.actualizar(evento);
        
        eliminar_recursividad(evento);
        return evento;
    }
    
    
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NotFoundException.class)
    public @ResponseBody Map<String, String> handleException(NotFoundException ex) {
        Map<String, String> fault = new HashMap<String, String>();

        fault.put("error", ex.getMensaje());

        return fault;
    }
    
    private void eliminar_recursividad(Evento evento) {

        if (evento.getAlojamientos() != null) {
            for (Alojamiento alojamiento : evento.getAlojamientos()) {
                alojamiento.getHotel().setAlojamientos(new ArrayList<Alojamiento>());
                alojamiento.setEvento(null);
            }
        }
       
        
        if ( evento.getRuta() != null ) {
            evento.getRuta().setEvento(null);
            if (evento.getRuta().getVuelos() != null) {
                for (Vuelo vuelo : evento.getRuta().getVuelos()) {
                    vuelo.setRuta(null);
                }
            }
        }
        
    }
}
